#coding=utf-8

from Misc.MZCCMisc import *
from MZCCListChecker import *

'''
' 目录检查
' 输入：
'  dirPath : 目录路径
'  blackList : 黑名单数组
'  whiteList : 白名单数组
'  enableSuffixList : 检查文件的后缀数组
'  problemThre : 输出问题数量阈值
' 输出：
'   问题列表
'''
def mzccDirCheck(dirPath, blackList, whiteList, enableSuffixList, problemThre, mzccSingleLineRules, mzccMulLineRules):
    filePathList = mzccDirCheckList(dirPath, blackList, whiteList, enableSuffixList);
    tmpProblemDic = mzccListCheck(filePathList, problemThre, mzccSingleLineRules, mzccMulLineRules);
    return tmpProblemDic;

########################################################################
# 支持函数

'''
' 某个目录下的待查文件列表（结合黑白名单）
' 输入：
'  dirPath : 目录路径
'  blackListArray : 黑名单数组
'  whiteListArray : 白名单数组
'  enableSuffixList : 检查文件的后缀数组
' 输出：
'   待查文件列表
'''
def mzccDirCheckList(dirPath, blackListArray, whiteListArray, enabledSuffixList):

    checkList = mzccBaseCheckList(dirPath, enabledSuffixList);
    for tmpWhiteItem in whiteListArray:
        mzccCheckListRemoveItem(checkList, tmpWhiteItem, enabledSuffixList);
    for tmpBlackItem in blackListArray:
        mzccCheckListAddItem(checkList, tmpBlackItem, enabledSuffixList);
    return checkList;

'''
' 将某个配置项添加入检查列表，支持目录
' 输入：
'  checkList : 检查列表
'  item : 配置项（黑名单项）
'  enableSuffixList : 检查文件的后缀数组
' 输出：
'   无
'''
def mzccCheckListAddItem(checkList, item, enabledSuffixList):
    if os.path.isdir(item):
        tmpList = mzccBaseCheckList(item, enabledSuffixList);
        for tmpItem in tmpList:
            if False == (tmpItem in checkList):
                checkList.append(tmpItem);
    else:
        if False == (item in checkList):
            checkList.append(item);

'''
' 将某个配置项添从检查列表删除，支持目录
' 输入：
'  checkList : 检查列表
'  item : 配置项（白名单项）
'  enableSuffixList : 检查文件的后缀数组
' 输出：
'   无
'''
def mzccCheckListRemoveItem(checkList, item, enabledSuffixList):
    if os.path.isdir(item):
        tmpWhiteList = mzccBaseCheckList(item, enabledSuffixList);
        for tmpItem in tmpWhiteList:
            if True == (tmpItem in checkList):
                checkList.remove(tmpItem);
    else:
        if True == (item in checkList):
            checkList.remove(item);

'''
' 某个目录下的基础待查文件列表
' 输入：
'  dirPath : 目录路径
'  enableSuffixList : 检查文件的后缀数组
' 输出：
'   待查文件列表
'''
def mzccBaseCheckList(dirPath, enableSuffixList):
    checkList = [];
    for curDir, subDirs, subFiles in os.walk(dirPath):
        for tmpFileName in subFiles:
            fileInfo = os.path.splitext(tmpFileName);
            for tmpSuffix in enableSuffixList:
                if tmpSuffix == fileInfo[1]:
                    checkList.append(curDir + r"/" + tmpFileName);
    return checkList;
